package org.dromara.common.mybatis.core.page

import cn.hutool.core.collection.CollUtil
import cn.hutool.http.HttpStatus
import com.baomidou.mybatisplus.core.metadata.IPage
import java.io.Serial
import java.io.Serializable

/**
 * 表格分页数据对象
 *
 * @author Lion Li
 * @updater LikeYouDo
 * @date 2025/1/26 19:25
 */
data class TableDataInfo<T>(

    /**
     * 列表数据
     */
    var rows: List<T>? = null,

    /**
     * 总记录数
     */
    var total: Long? = null,

    ) : Serializable {

    /**
     * 消息状态码
     */
    var code: Int? = null

    /**
     * 消息内容
     */
    var msg: String? = null

    init {
        code = HttpStatus.HTTP_OK
        msg = "查询成功"
    }

    companion object {
        @Serial
        private val serialVersionUID: Long = 1L

        /**
         * 根据分页对象构建表格分页数据对象
         */
        @JvmStatic
        fun <T> build(page: IPage<T>): TableDataInfo<T> {
            return TableDataInfo<T>(
                rows = page.records,
                total = page.total
            ).apply {
                code = HttpStatus.HTTP_OK
                msg = "查询成功"
            }
        }

        /**
         * 根据数据列表构建表格分页数据对象
         */
        @JvmStatic
        fun <T> build(list: List<T>): TableDataInfo<T> {
            return TableDataInfo(
                rows = list,
                total = list.size.toLong()
            ).apply {
                code = HttpStatus.HTTP_OK
                msg = "查询成功"
            }
        }

        /**
         * 构建表格分页数据对象
         */
        @JvmStatic
        fun <T> build(): TableDataInfo<T> {
            return TableDataInfo<T>().apply {
                code = HttpStatus.HTTP_OK
                msg = "查询成功"
            }
        }

        /**
         * 根据原始数据列表和分页参数，构建表格分页数据对象（用于假分页）
         *
         * @param list 原始数据列表（全部数据）
         * @param page 分页参数对象（包含当前页码、每页大小等）
         * @return 构造好的分页结果 TableDataInfo<T>
         */
        @JvmStatic
        fun <T> build(list: List<T>, page: IPage<T>): TableDataInfo<T> {
            if (CollUtil.isEmpty(list)) {
                return build()
            }
            val pageList = CollUtil.page(page.current.toInt() - 1, page.size.toInt(), list)
            return TableDataInfo(pageList, list.size.toLong())
        }
    }
}
